package com.tim.helper.inactive;

import com.tim.third.demo.map_struct.MapStructInf;
import com.tim.third.demo.map_struct.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.util.Arrays;

/**
 * 字面量：1、true、"hi" ；
 * 实例引用：person(root对象person属性)、#person.name(context中person对象id属性)、person.getState()
 * 静态引用：T(java.lang.Math).PI、T(Math).random()
 *
 * 运算符：
 * 算术运算：+、-、*、/、%、^(方次，T(Math).PI^2
 * 比较运算：>、<、==、>=、<=、gt、lt、eq、ge、le
 * 逻辑运算：and、or、not、|
 * 条件运算：?:；用于判定null时可简写，person.name?:'ltl'
 * 正则表达式：matches；person.name matches '\w+'
 *
 * 集合计算：
 * [ num]；引用元素
 * .?[expr ]；过滤元素，保留true元素
 * .^[expr]、.$[expr]；第一个/最后一个匹配
 * .![ ]；属性投影，类似Stream#map()
 */
@Slf4j
public class SpringSpelHelper {
	@Test
	public void test() {
	}

	/**
	 * 引用
	 * 字面量：1、true、"hi" ；
	 * 实例引用：person(root对象person属性)、#person.name(context中person对象id属性)、person.getState()
	 * 静态引用：T(java.lang.Math).PI、T(Math).random()
	 */
	@Test
	public void reference(){
		User root = new User();
		root.setId(123L);
		EvaluationContext context = new StandardEvaluationContext(root);
		context.setVariable("id", 1);
		ExpressionParser parser = new SpelExpressionParser();
		org.springframework.expression.Expression exp;

		exp = parser.parseExpression("true");// 字面量
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("#id");// context对象属性
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("id");// root对象属性
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("T(java.lang.Math).random()");// 静态引用
		System.out.println(exp.getValue(context));

	}

	/**
	 * 运算符：
	 * 算术运算：+、-、*、/、%、^(方次，T(Math).PI^2
	 * 比较运算：>、<、==、!=、>=、<=；gt、lt、eq、ge、le、ne
	 * 逻辑运算：and、or、not、|
	 * 条件运算：?:；用于判定null时可简写，person.name?:'ltl'
	 * 正则表达式：matches；person.name matches '\w+'
	 */
	@Test
	public void operator() {
		User root = new User();
		root.setId(123L);
		root.setEmail("haha");
		EvaluationContext context = new StandardEvaluationContext(root);
		context.setVariable("id", 1);
		ExpressionParser parser = new SpelExpressionParser();
		org.springframework.expression.Expression exp;

		// 算术运算
		System.out.println("算术运算");
		exp = parser.parseExpression("1*2");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("2%3");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("2^3");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("email+3");// 参数为字符串，拼接
		System.out.println(exp.getValue(context));

		// 比较运算
		System.out.println("比较运算");
		exp = parser.parseExpression("'1'=='2'");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("1<=2");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("#id!=2");
		System.out.println(exp.getValue(context));

		// 逻辑运算
		System.out.println("逻辑运算");
		exp = parser.parseExpression("1==1 and 1!=2");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("1==1 or 1!=2");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("1==1 and not (1!=2)");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("not (1==2)");
		System.out.println(exp.getValue(context));

		// 条件运算
		System.out.println("条件运算");
		exp = parser.parseExpression("1==2 ? 1 : 0");
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("#ltl ?: 'not exist'");// null判定简写
		System.out.println(exp.getValue(context));
		exp = parser.parseExpression("#id ?: 'not exist'");
		System.out.println(exp.getValue(context));

		// 正则表达式
		System.out.println("正则表达式");
		exp = parser.parseExpression("'litianlin' matches '\\w+'");
		System.out.println(exp.getValue(context));

	}

	/**
	 * 集合计算：
	 * [ num]；引用元素
	 * .?[expr ]；过滤元素，保留true元素
	 * .^[expr]、.$[expr]；第一个/最后一个匹配
	 * .![ ]；属性投影，类似Stream#map()
	 *
	 */
	@Test
	public void collection() {
		User root = new User();
		root.setId(123L);
		EvaluationContext context = new StandardEvaluationContext(root);
		context.setVariable("list", Arrays.asList(root, new User(124L, null, 1, null, null)));
		ExpressionParser parser = new SpelExpressionParser();
		org.springframework.expression.Expression exp;

		exp = parser.parseExpression("#list[0].id");// 引用元素
		System.out.println(exp.getValue(context));

		exp = parser.parseExpression("#list.?[id>122]");// 过滤元素，保留true元素
		System.out.println(exp.getValue(context));

		exp = parser.parseExpression("#list.?[id>123]");
		System.out.println(exp.getValue(context));

		exp = parser.parseExpression("#list.^[id>122]");// 第一个/最后一个匹配
		System.out.println(exp.getValue(context));

		exp = parser.parseExpression("#list.$[id>122]");
		System.out.println(exp.getValue(context));

		exp = parser.parseExpression("#list.![id]");// 属性投影，类似Stream#map()
		System.out.println(exp.getValue(context));

	}


}
